.\" Modified Sat Jan 14 13:38:30 CST 2017 by caiwang213
.\"   <caiwang213@qq.com>
.\"
.TH git 3 2017-01-13 "Linux" "Linux Programmer's Manual"
.SH NAME
git \- linux git tool
.SH 安装方法
.PD 0
.TP
sudo yum install libcurl-devel
.TP
sudo yum install expat-devel
.TP
make configure
.TP
 ./configure --with-curl --with-expat
.TP
make
.TP 60
.B sudo yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker 
# 提示Can't locate ExtUtils/MakeMaker.pm相关错误
.TP
sudo make install

.SH 常见问题
.TP
.B a
git clone: fatal: Unable to find remote helper for 'https'
.B S.
该问题是由 git configure 配置时没有设定 --with-curl --with-expat 造成. 

.SH [创建git仓库]
.PD 0  
.TP   
mkdir utuw
.TP   
cd utuw
.TP   
git init.
.TP   
touch README.md
.TP   
git add README.md
.TP   
git commit -m "first commit"
.TP   
git remote add origin https://git.oschina.net/caiwang213/utuw.git
.TP   
git push -u origin master

.SH [已有项目]
.TP   
cd existing_git_repo
.TP   
git remote add origin https://git.oschina.net/caiwang213/utuw.git
.TP   
git push -u origin master


.SH [git多人协作]
.TP   
[创建项目代码管理员]
.TP  
useradd admin
.TP   
passwd  admin  
.BR

.TP   
[创建项目小组]
.TP  30 
.B groupadd proj-team  
创建项目小组，可以 cat /etc/group查看组ID
.TP
.B usermod -G proj-team admin 
将管理员加入到该组中,注意 usermod -g proj-team admin是改变用户所在的组
.BR

.TP
[项目小组添加开发成员]
.TP
.B useradd -g proj-team john
.TP
.B passwd john
.TP
.B useradd -g proj-team jessica
.TP
.B passwd jessica


.SH [创建git裸仓库]
.TP
.B sudo adduser git
.TP
.B sudo passwd git
.TP
.B su git
.TP
.B cd ~
.TP
.B git init --bare sample.git
.TP
.B sudo vi /etc/passwd 将git:x:507:508::/home/git:/bin/bash 改为
.TP
.B git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
.TP
.B git clone git@192.168.60.99:/home/git/sample.git

.SH [创建git项目仓库]
.TP
.B mkdir proj 
.TP
.B cd proj 
.TP
.B git init
.TP
.B touch README.md
.TP
.B git add README.md
.TP
.B git commit -m "first commit"
.TP
.B git remote add origin https://git.oschina.net/caiwang213/proj.git
.TP
.B git push -u origin master
.BR

.SH [john,jessica获取git工程]
.TP
.B git clone john@192.168.60.99:/home/source/proj/.git
.TP
.B git clone jessica@192.168.60.99:/home/source/proj/.git

.SH	[修改提交代码]
.TP 45
.B git commit -a  
# 把所有add了的文件都加入commit，然后进入编辑器编辑commit信息
.TP
.B git commit -am "comment"  
# 相当于 git add xx与git commit -m ""组合

.SH [本地分支管理]
.TP 45 
.B git checkout -b dev  
# 创建并切换，等于git branch dev; git checkout dev
.TP
.B git branch -a        
# -l 查看本地，-a查看所有，-r 只查看远程分支 
.TP
.B git checkout master  
.TP
.B git merge dev
.TP
.B git branch --merge   
# 查看已经合并了,--no-merge查看还没有合并的
.TP
.B git branch -d dev    
# 合并了的就可以删除了，没合并删除会有提示
.TP
.B git branch -D dev    
# 强行删除了
.TP
.B git push origin featureA 
# 推送本地分支
.TP
.B git checkout -b featureA origin/featureA  
# 获取远程分支到本地, git pull默认不会获取远程分支
.TP
.B git push origin :featureA 
# 删除远程分支
.TP
.B git remote prune origin   
# 其他用户更新本地服务器上已经删除的分支（服务器已经删除了分支，默认其他用户还可以看到) 
.TP
.B git fetch -p              
# 其他用户更新本地服务器上已经删除的分支（服务器已经删除了分支，默认其他用户还可以看到) 
.TP
.B git branch -m dev dev1    
# 重命名本地分支

.SH	[分支更新,冲突解决]
.TP 45
.B git checkout master
.TP
.B git fetch origin master   
# 默认git fetch
.TP
.B git log -p master..origin/master 
# 比较修改了哪些，决定是否合并
.TP
.B git merge origin master   
# 合并
.TP
.B git pull origin master    
# 相当于git fetch; git merge

.SH [Bug分支, git stash]
.TP 45
.B git branch                
# b_stash
.TP
.B git stash                 
# 储藏当前本分支（暂存内容必须已经被git管理）              
.TP
.B git status
.TP
.B git checkout master       
# 切换至主分支
.TP
.B git checkout -b bug-01    
# 创建bug-01分支，然后修复代码
.TP
.B git commit -am "fix bug-01" 
# 提交修复代码
.TP
.B git checkout master       
.TP
.B git merge --no-ff -m "merged bug fix 101" bug-01 
# 合并修改代码
.TP
.B git branch -d bug-01      
# 删除已经合并的分支
.BR
.TP
.B git checkout b_stash      
# 回到原来开发暂存分支
.TP
.B git status
.TP
.B git stash list            
# 列出暂存栈
.TP
.B git stash pop             
# 恢复暂存文件
.BR
.TP
.B git stash apply stash@{0} 
# 你可以多次stash与恢复
.TP
.B git stash clear           
# 清空暂存栈


.SH [git diff比较]
.TP 45
.B git diff                  
# 工作区（working）与暂存区stage比较
.TP
.B git diff --staged         
# 暂存区stage与上次提交HEAD比较, 等同--cached,适应情形：在运行git commit（不带'-a'）之前，查看所有载入而未提交的变更内容
.TP
.B git diff HEAD             
# 工作区（working）与次提交HEAD比较
.TP
.B git diff branch_name      
# 当前工作区（working）与另外一个分支比较
.TP
.B git diff branch1 branch2  
# 两个分支比较，或git diff branch1..branch2
.TP
.B git diff HEAD^ HEAD       
# 上两次提交比较
.TP
.B git diff HEAD^ HEAD --stat 
# 只显示简要信息 
.TP
.B git diff SHA1 SHA2        
# 两个历史版本比较

.SH [本地与远程比较]
.TP 45
.B git fetch origin
.TP
.B git diff master origin/master

.SH [rebase合并提交]
.TP 45
.B git diff origin/当前分支
# 注意先跟远程当前分支比较，已经push了千万别要git rebase
.BR
.TP
.B git log --pretty=oneline       
# 获取需要合并的commit的前一个commit_id
.TP
.B git rebase -i cf127ae
# 进入 VIM 模式，除第一个pick外，其余的全部修改成squash，也可以缩写为 s
.TP
.B git rebase -i @{upstream}
# 当前分支从分支分开第一个提交到最新提交合并为一次提交,免去自己去查看最早一个commit_id

.SH [rebase 合并分支]
.TP 45
.B git rebase -i develop
# 以develop为基准合并develop到当前分支，develop之后的commit-id合并成一个commit-id, 交需要执行(n - 1次)git rebase --continue

.SH [merge --squash多个commit打包合并分支]
.TP 45
.B git merge --squash branch-A
# 当前分支合并branch-A, branch-A所有提交commit-id合并为一个commit-id, 然后再合并

.SH [日志查看]
.TP 45
.B git log --graph --pretty=oneline --abbrev-commit 
#展示了每个提交所在的分支及其分化衍合情况
.TP
.B git log -n    
# 查看最近n条日志
.TP
.B git log -p -2 
# -p 选项展开显示每次提交的内容差异，用 -2 则仅显示最近的两次更新
.TP
.B git reflog    
# 查看git操作所有历史命令，
.TP
.B git log -p master..origin/master 
# 比较本地与远程分支
	  

.SH [修改最后一次提交]
.TP 45
.B git commit -m 'initial commit'
.TP
.B git add forgotten_file
.TP
.B git commit --amend    
# 上面的三条命令最终只是产生一个提交，第二个提交命令修正了第一个的提交内容。
.TP
.B git commit --amend    
# 记住!!!!!!!!!!!!!!!!  已经合并到主分支的提交commit, 千万不要再合并commit，否刚会产生冲突


.SH [merge文件冲突解决]
.TP 45
.B git mergetool
.TP
.B git ci -am "解决冲突" 

.SH [merge 二进制文件冲突解决]
.TP 45
.B git merge B  
# 试图将B分支合并到A分支上，会提示test.docx合并冲突  
.TP
.B git checkout test.docx --ours / --theirs
# 保留A分支(当前分支)上的改动, --theirs表示保留B分支(被合并分支)上的改动
.TP
.B git add test.docx 
# 提交改动后的文件  
.TP
.B git commit -m 
# 解决了test.docx上的冲突，保留了A分支改动"

.SH [恢复到git pull/ git merge 前的状态]
.TP 45
.B git merge --abort

.SH [取消已经暂存的文件]
.TP 45
.B git add file
.TP
.B git reset HEAD file


.SH [取消已经暂存的文件]
.TP 45
.B git checkout -- file  
# 注意风险
.TP
.B git checkout .        
# 注意风险

.SH [版本移动]
.TP 45
.B git reset --hard HEAD^  
# 后移1个版本
.TP
.B git reset --hard HEAD~3 
# 后移3个版本
.TP
.B git reset --hard commit_id 
.TP
.B git reflog              
# 查看git操作所有历史命令，查看最后一次commit_id
.TP
git reset --hard commit_id 

.SH [标签]
.TP 45
.B git tag                 
# 查看
.TP
.B git checkout master
.TP
.B git tag v1.0            
# 当前版本
.TP
.B git log --pretty=oneline --abbrev-commit
.TP
.B git tag v0.9 commit_d   
# 历史版本
.TP
.B git tag -a v0.1 -m "version 0.1 released" commit_d 
# -m指定文字说明 
.TP
.B git show v1.0           
# 查看标签信息
.TP
.B git push origin v1.0    
# 分享标签
.TP
.B git push origin --tags   
# 一次推送所有本地标签

.SH [配置别名]
.TP 45
.B git config --list   
# 查看已经配置信息 
.TP
.B git config --global alias.co checkout
.TP
.B git config --global alias.ci commit
.TP
.B git config --global alias.st status
.TP
.B git config --global alias.br branch
.TP
.B git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
.TP
.B vi .git/config          
# 当前用户配置在.git/config文件中修改
.TP
.B git config --global core.editor vim
# 修改默认编辑器为vim
.TP
.B git config --global core.autocrlf input
# git在提交时把CRLF转换成LF，签出时不转换

.SH [difftoo/mergetool配置]
.TP 45
.TP
.B git config --global diff.tool vimdiff
.TP
.B git config --global merge.tool vimdiff

.SH [配置代理]
.TP
.B git config --global http.proxy http://10.7.3.63:18608 #
.TP
.B git config --global https.proxy 10.7.3.63:18608       #
.TP
.B git remote add cyg ssh://svn@120.25.206.25:60065/home/svn/repos/git-project/P3000v3.git

